﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using OpenLab.BLL;

namespace OpenLab.UI.Parametrage
{
    public partial class Branche : Form
    {
         /*declaration**************************************************/
        readonly BrancheBLL _repository = new BrancheBLL();//moteur de methode
        private Model.Branche _branche = new Model.Branche();//objet principale
        private List<Model.Branche> _branches = new List<Model.Branche>();//liste d'objets

        readonly BindingSource _bs = new BindingSource();//binding source liste
        /**************************************************************/


        /*constructeur*************************************************/
        public Branche()
        {
            InitializeComponent();

            InitializeForm();//initialiser le formulaire
        }
        /**************************************************************/


        /*initialisation avant chargement de deonne*********************/
        void InitializeForm()
        {
            InitializeDataList(); //init grid (choisir les option de selection et mise a jour)

            LoadData(); //charger les donnees

            MiseEnFormeGrid(); //mettre en forme le grid de donnees

            //ajouter les evennements sur les boutons
            okbtn.Click += okbtn_Click;
            filtertxt.TextChanged += filtertxt_TextChanged;

            //methode anonyme sur ajoutbtn (pour demo)
            ajoutbtn.Click += delegate { ClearData(); };
            cancelbtn.Click += delegate { ClearData(); };

            //set role sur botons
            exitbtn.DialogResult = DialogResult.Cancel;//informer windows que exitbtn est un bouton pour quiter form
        }


        void InitializeDataList()
        {
            branchesdgv.ReadOnly = true; //disable edit
            branchesdgv.AllowUserToAddRows = false; //disable add new row
            branchesdgv.AllowUserToDeleteRows = true; //enable delete row

            branchesdgv.UserDeletingRow += branchesdgv_UserDeletingRow; //add delete event
            branchesdgv.CellContentClick += branchesdgv_CellContentClick; //add click element event
        }
        /**************************************************************/


        /*evenement sur les controles utilisateur**********************/
        void filtertxt_TextChanged(object sender, EventArgs e)
        {
            // ReSharper disable once PossibleNullReferenceException
            _bs.Filter = String.Format(" ordre LIKE '%{0}%' or designation LIKE '%{0}%' ", (sender as TextBox).Text);
        }

        void branchesdgv_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            //si CurrentRow == null => ne rien faire
            if (branchesdgv.CurrentRow == null) return;
            
            //obtenir id de l'element delectionne
            int selectedId = Convert.ToInt32(branchesdgv.CurrentRow.Cells["id"].Value);

            //obtenir instance de l'element selectionne
            _branche = _branches.SingleOrDefault(x => x.id == selectedId);
            
            //bind l'element dans l'interface
            BindBranche();
        }

        void branchesdgv_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {
            //message de supression
            var dr = MessageBox.Show("الرجاء تأكيد الحذف", Text, MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
            e.Cancel = true;//annuler la supression de la ligne
            //si l'action de supression est annule
            if(dr == DialogResult.Cancel)
            {
                return;
            }
            //supprimer l'element selectionne
            _repository.DeleteById(_branche.id);

            //vider le champs de saisi
            ClearData();

            //recharger les donnnes
            LoadData();
        }

        void okbtn_Click(object sender, EventArgs e)
        {
            //alimenter l'objet Branche
            GetBranche();

            //verifie si les donnees ne sont pas vide (Trim() pour supprimer les espace au debut et a la fin)
            if (_branche.ordre.ToString().Trim() == "" || _branche.designation.Trim() == "") return;

            //inserrer ou modifier les donnes
            if (_branche.id > 0)
                _repository.Update(_branche);
            else
                _repository.Add(_branche);

            //vider les champs de saisie
            ClearData();

            //recharger les donnes
            LoadData();
        }
        /**************************************************************/
        

        /*methode pour lier les donnees avec le form*******************/
        void BindBranche()
        {
            //charger l'objet Branche dans les champs de saisie
            ordretxt.Text = _branche.ordre.ToString();
            designationtxt.Text = _branche.designation;
        }

        void GetBranche()
        {
            //charger les champ de saisie dans l'objet Branche
            _branche.ordre = Convert.ToInt32(ordretxt.Text);
            _branche.designation = designationtxt.Text;
        }
        /**************************************************************/


        /*methode de chargement et mise en form  des donnees************/
        void LoadData()
        {
            //chargement des donnees
            _branches = _repository.GetAll().ToList();
            _bs.DataSource = Helper.Utile.ListToDatatable(_branches);//convertir la liste en datatable pour le filtrage
            branchesdgv.DataSource = _bs;
        }

        void MiseEnFormeGrid()
        {
            // ReSharper disable PossibleNullReferenceException
            branchesdgv.Columns["id"].Visible = false; //cacher la column id

            //resize columns
            branchesdgv.Columns["ordre"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells; //afficher les text
            branchesdgv.Columns["designation"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;// prendre l'espace restant de l'interface

            //changer les nom des columns
            branchesdgv.Columns["ordre"].HeaderText = "ترتيب";
            branchesdgv.Columns["designation"].HeaderText = "الإسم";
        }
        /**************************************************************/


        /*vider les donnees*********************************************/
        void ClearData()
        {
            //vider les champs
            ordretxt.Text = designationtxt.Text = "";
            ordretxt.Focus();
            _branche = new Model.Branche();
        }
        /**************************************************************/
    }
}
